題目:
(6 級) Sum of Digits / Digital Root
給予一個數字 n
,算出每個數位的加總。如果總和超過一數位,則繼續加總直到只剩個位數。
範例:
16 -> 1 + 6 = 7
942 -> 9 + 4 + 2 = 15 -> 1 + 5 = 6
132189 -> 1 + 3 + 2 + 1 + 8 + 9 = 24 -> 2 + 4 = 6
493193 -> 4 + 9 + 3 + 1 + 9 + 3 = 29 -> 2 + 9 = 11 -> 1 + 1 = 2
思考方式:
Ruby 解法:
def digital_root(n)
# 把 `n` 轉成字串
# 把該字串用 split("") 轉成陣列
# 用 map 傳入 to_i method 把每個 element 轉回數字
# 最後加總
total = n.to_s.split("").map(&:to_i).sum
# 如果總和大於等於 10 重新呼叫一次 digital_root method
# 並把該次計算的總和當作參數丟進去再跑一次
# 反之則回傳 total
total >= 10 ? digital_root(total) : total
end
JavaScript 解法:
function digital_root(n) {
// 把 `n` 轉成字串
// 把該字串用 split("") 轉成陣列
// 直接用 reduce function 把總和算出來
total = n.toString().split("").reduce((sum, i) => {
// 先把 sum 轉成數字
sum = Number(sum);
// 回傳兩個數字的加總
return sum += Number(i);
// 加法的 identity 設為 0
}, 0);
// 如果總和大於等於 10 重新呼叫一次 digital_root function
// 並把該次計算的總和當作參數丟進去再跑一次
// 反之則回傳 total
return total >= 10 ? digital_root(total) : total;
}
心得:
雖然有試過 Ruby 直接用 reduce 方法來寫,但寫出來就少了一種 Ruby 的 "優雅感",所以最後決定還是用看起來很厲害的 map(&:to_i).sum